Wang Haihua
🍈 🍉🍊 🍋 🍌
求下列函数的最大值: $$ f(x)=\left(1-x^{3}\right) \sin (3 x),-2 \pi \leq x \leq 2 \pi . $$
为了便于理解, 先做图, 可见, 函数在 $-6$ 和 6 附近达到最大值, 最大值接近 195。如果使用优化命令 fminbound
求解, 只能求得局部极大 点 $x=-3.7505$, 对应的局部极大值为 $y=52.0046$ 。显然结果是错误的, 原因是 fminbound
容易陷入局部极值, 这也是许多优化算法难以克服的一个困 难。
用随机模拟的方法,就是随机产生若干个自变量的值来搜索,例如取100个点,求得的最大值在194附近,结果要好得多。
代码
import numpy as np
from matplotlib.pyplot import rc, plot, show
from scipy.optimize import fminbound, fmin
rc('font',size=16)
fx=lambda x:(1-x**3)*np.sin(3*x);
x0=np.linspace(-2*np.pi,2*np.pi,100);
y0=fx(x0); plot(x0,y0); show()
xm1=fminbound(lambda x:-fx(x),-2*np.pi,2*np.pi)
ym1=fx(xm1); print(xm1,ym1,'\n--------------')
xm2=fmin(lambda x:-fx(x), -2*np.pi)
ym2=fx(xm2); print(xm2,ym2,'\n--------------')
x=np.random.uniform(-2*np.pi,2*np.pi,100)
y=fx(x); ym=y.max()
xm=x[y==ym]; print(xm,ym)
import numpy as np
from matplotlib.pyplot import rc, plot, show,savefig
from scipy.optimize import fminbound, fmin
rc('font',size=16)
fx=lambda x:(1-x**3)*np.sin(3*x);
x0=np.linspace(-2*np.pi,2*np.pi,100);
y0=fx(x0); plot(x0,y0);
savefig('images/sim1001.png')
show()
xm1=fminbound(lambda x:-fx(x),-2*np.pi,2*np.pi)
ym1=fx(xm1); print(xm1,ym1,'\n--------------')
-3.7505026680508093 52.00462222535155 --------------
xm2=fmin(lambda x:-fx(x), -2*np.pi)
ym2=fx(xm2); print(xm2,ym2,'\n--------------')
Optimization terminated successfully. Current function value: -194.906195 Iterations: 15 Function evaluations: 30 [-5.81608816] [194.90619465] --------------
x=np.random.uniform(-2*np.pi,2*np.pi,100)
y=fx(x); ym=y.max()
xm=x[y==ym]; print(xm,ym)
[-5.81863236] 194.9001725139532